package middlewareWeb;

import java.net.*;
import java.io.*;
/**
 *Classe che implementa il proxy di tipo UDP
 * @author jhonny
 */
public class TQueueManagerProxyUDP extends TQueueManagerProxy {

    public TQueueManagerProxyUDP()
    {
        super();
    }
    /**
     * Implementazione del metodo di interfaccia per l'aggiunta di un
     * Task descriptor alla coda
     * @param td descrittore del task
     */
    public int enqueue(TaskDescriptor td){

        int result= -1;
        //Questo metodo dovrà interfacciarsi tramite la rete (socket) al
        //TQueueManager allo scopo di nascondere al Manager, l'esistenza stessa
        //della rete
        //Ciò è realizzato grazie al fatto che passiamo un oggetto Address
        try
        {
            DatagramSocket socket = new DatagramSocket();
            ByteArrayOutputStream bout = new ByteArrayOutputStream();

            byte[] datagramMessage = new byte[512];

            String[] addrIP = addr.getIp().split("\\.");
            byte[] byteIP = new byte[addrIP.length];
            for(int i = 0;i<addrIP.length;i++)
               byteIP[i] = Byte.decode(addrIP[i]);

            DatagramPacket datPacket = new DatagramPacket(datagramMessage,datagramMessage.length,InetAddress.getByName("LocalHost"),addr.getPort());

            ObjectOutputStream dout = new ObjectOutputStream(bout);
            dout.writeObject(td);
            dout.flush();
            datagramMessage = bout.toByteArray();
            datPacket.setData(datagramMessage);
            datPacket.setLength(datagramMessage.length);
            socket.send(datPacket);
            bout.reset();
            
            DatagramPacket response = new DatagramPacket(datagramMessage,datagramMessage.length);
            socket.receive(response);
            ByteArrayInputStream bin = new ByteArrayInputStream(response.getData(),0,response.getLength());
            DataInputStream ddis = new DataInputStream(bin);
            result = ddis.readInt();
            socket.close();
            System.out.println("Inserito in coda " + result);
        }
        catch(Exception ex)
        {
            System.out.println("Eccezione: " + ex.getMessage());
        }
        return result;
    }
}
